#pragma once

#include "noncopyable.h"

#include <string>
#include <vector>
#include <memory>
#include <functional>

class EventLoop;
class EventLoopThread;

// 管理EventLoopThread
class EventLoopThreadPool : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop *)>;

    EventLoopThreadPool(EventLoop *baseloop, const std::string &nameArg);
    ~EventLoopThreadPool();

    void setThreadNum(int numThreads) { numThreads_ = numThreads; }
    void start(const ThreadInitCallback &cb = ThreadInitCallback());
    // 轮询获取subloop。如果没有subloop，baseloop则充当subloop
    EventLoop *getNextLoop();

    // 获取所有的subloop
    std::vector<EventLoop *> getAllLoops();

    bool started() { return started_; }
    const std::string &name() { return name_; }

private:
    // 用户最开始创建的loop
    EventLoop *baseLoop_;
    // 线程池的名称
    std::string name_;
    // 启动线程池，创建numThreads_个新线程
    bool started_;
    int numThreads_;
    // 新线程的下标
    int next_;
    // 存储新创建的线程
    std::vector<std::unique_ptr<EventLoopThread>> threads_;
    // 存储新线程对应的loop
    std::vector<EventLoop *> loops_;
};